===============================================================================
                      GreenTeaSpeak 2 - Client Changelog
                       Copyright GreenTeaSpeak Systems
                          https://www.greenteaspeak.de
===============================================================================
   + Added feature or noticeable improvement
   - Bug fix or something removed
   * Changed or Information
   ! Important - Take note!
===============================================================================

2.11.8:

2.11.7:
- ServerQuery: Create works again — enter a username; the server generates the
  password (shown once, copyable). Matches TeaSpeak/oldclient `querycreate` /
  `notifyquerycreated` (Electron has no `window.prompt`).

2.11.6:
- Camera and screen share work again in packaged builds (Electron 44): production
  UI is served via privileged `gts-app://` instead of `file://` from the asar
  (dev/`npm start` already used http://localhost). Session permissions also allow
  `mediaKeySystem` / `speaker-selection`; display-media errors are logged.

2.11.5:
+ Chat: offline / left clients can be banned (and unbanned when listed) from the nickname context menu via Unique ID — TeamSpeak-style `banadd` / `bandel`, no live client id required
+ Weak-CPU voice: clearer [voice-tx]/[voice-rx] drop tags + UDP socket buffer / encode-worker priority fixes in shared natives (Win+Linux teaclient_connection rebuilt ABI 149; see packages/native-bridge/VOICE-PERF.md; mac packaging still stub)

2.11.4:

2.11.3:
- Screen share: turning stream audio off (or starting video-only) no longer kills
  microphone TX. Loopback is fully detached (not left muted on sendrecv), idle RTC
  audio m-lines stay recvonly, and native mic capture (including RNNoise JS TX) is
  hard-rebound with delayed retries after Chromium desktop capture settles
+ Extensions catalog: plugin/theme/soundpack preview images from the API are cached
  on disk (userData/cache/catalog-images) and served via gts-catalog-img:// so
  opening Online no longer re-downloads every thumb; URL change or weekly ETag
  revalidation refreshes stale files
+ Themes: deactivate the active UI theme (header "Deactivate" and row toggle) to
  return to the built-in default appearance
+ Chat: usernames in server/channel/private lines (join/poke/authors) are clickable
  and open the same client context menu as a tree right-click; offline/left clients
  still open a UID-based menu (chat, copy nick/UID, friend/block, contacts)
- Chat is scoped per server tab again (like oldclient handlerId conversations);
  switching tabs no longer mixes histories, and channel messages no longer paint
  into an open private chat after a late history race
+ First-run setup wizard (nickname, optional myGreenTeaSpeak login, microphone and
  speakers) shown once on a virgin install, matching the classic client flow
+ Placeholder nicknames ("Another GreenTeaSpeak user", "Standard Identität" /
  "Standart Identität", and related defaults) prompt for a real nick before connect
  and when a default identity is still in use

2.11.2:
+ Capture: adjustable outbound noise suppression (RNNoise WASM) with a dedicated
  strength slider under Settings -> Capture -> Digital signal processing; 0% = off,
  higher values wet-mix stronger denoising (keyboard/fan noise). Native TeaSpeak
  RNNoise apply_config remains disabled (crashes this build)
+ Channel info panel shows the numeric channel ID (cid); click to copy
* Runtime: Electron upgraded to 44.5.1 (Chromium 152, Node 24, ABI 149);
  electron-builder 26.x. Darwin TeaSpeak natives must be rebuilt for ABI 149
  before voice (NODEJS_VERSION=v44.5.1)
- Microphone: connecting in a new server tab claims the mic on that tab and mutes
  the other tab(s); toolbar mute refreshes immediately; user unmute still claims
  exclusive mic (siblings muted)
* Startup: no branded boot splash — main window stays hidden until ready-to-show
  and uses the app background so cold start paints the client shell directly;
  "API unavailable" only after timeout (browser-only / misconfigured start)

2.11.1:
+ Soft 3D: a plugin can turn spatial voice back on. People inside voice range are
  audible; people outside range or without a position are muted locally. Your own
  client volume is unchanged. While a plugin controls 3D, the Extras menu item is
  checked and the 3D grid stays locked
- File browser, virtual server settings, and channel edit stay on the server tab
  they were opened from. Switching the visible tab no longer retargets save or the
  channel list. If that tab is gone, the window closes
+ Plugins can join channels, set nickname, mute other users, and read connection
  state on a background server tab. Without connectionId, the focused tab is still
  used

2.11.0:
- Channel tree: locally muted users show the TeamSpeak local-mute icon
  (crossed-out microphone) while local mute is active
+ Plugin SDK: connection.getState() now includes the local user's nickname and
  current channel (ch- id) so a plugin can save both and restore them later

2.10.9:
- Top toolbar: action icons (microphone, speaker, recording, subscribe, away,
  screen share, host button) enlarged from 16 to 18 px for better legibility; button
  hitbox unchanged
- Invite/connect links (gts2server://, ts3server://): a “+” in a token/password was
  turned into a space while parsing (and a leading “+” was dropped entirely), so
  Base64 values like “+cH9…” broke and joining failed — “+” is now preserved
+ Changelogs: per-platform stub files under github/changelog/ (macos.de.txt / macos.en.txt)
  prepared for a future macOS package; client would pick darwin + UI language
+ UI themes: editable user template (resources/themes/_user_template) with theme.css /
  theme.json; Settings → Extensions → Themes → “Create from template…” copies it into
  userData/themes, activates it, and opens the folder for editing
* UI themes: shipped user template is now an LCARS theme (black void, peach/cyan/
  teal/gold/lavender, flat CSS variables)
+ Recording: starting/stopping the WAV recording now plays a soundpack cue
  (recording.started / recording.stopped); own recording status is broadcast via
  client_is_recording so everyone in the channel hears and sees “recording started/
  stopped” when the server relays the flag (TeamSpeak-style notification)

2.10.8:
- Crash reporter: quote Electron/exe paths in the native crash callback so
  installs or repo paths with spaces (e.g. "GreenTeaSpeak 2", "GTS2 Client")
  actually launch the crash-UI after a dump

2.10.7:
- Updater: restore Version.isDevelopmentVersion() removed by the SemVer-first
  compare change — without it refreshUpdaterStatus threw and the UI stayed on
  "Checking…" / "Wird geprüft…" forever (no up-to-date, error, or available state)
* Updater: wrap the full update-check path so unexpected errors and API timeouts
  always leave "checking" with a clear error message (incl. timeout copy)
* Updater UI: if the refresh IPC rejects without onStatus, show an error instead
  of infinite checking; German up-to-date title → "Client ist aktuell"
- Updater: SemVer is authoritative — same X.Y.Z no longer offers an update when
  the local build timestamp is already >= remote (timestamp only matters for
  same-SemVer rebuilds; never force a SemVer downgrade via a newer stamp)
- Linux/Windows folder-update: always sync app-info.json + ChangeLog.txt into
  install root and resources/ so the next check matches the shipped package
* loadAppInfo: also read resources/app-info.json (deb/extraResources); pick the
  newest candidate so a stale root stamp cannot re-prompt after a successful update
* Linux/Windows release scripts + electron-builder extraResources: ship app-info.json
  and ChangeLog.txt next to the asar (not only inside it)

2.10.6:
* Elevation prompt copy: mention /opt and polkit (not Windows-only wording)

2.10.5:
- Linux updater: accept linux-unpacked/greenteaspeak2 (and AppImage) packages instead of requiring Windows Setup.exe; apply folder-update via in-place copy after quit
* Repo: gitignore local `secrets` file (never commit upload credentials)

2.10.4:
- Soundpack download: extract ZIP/.ts3_soundpack via unzip (GNU tar cannot open ZIP —
  "Das sieht nicht wie ein tar-Archiv aus"); reject HTML error pages
- Multi-tab voice: keep native playback bind on a connected tab while a new tab
  is still connecting; rewarm VoiceClients after attach/rebind (fixes dead output
  on new-tab connect); exclusive mic mute on other tabs when an additional unmuted
  tab is spawned
* .gitignore: keep native/build/linux_x64 (and win32_x64) explicitly tracked
- Linux CI: dist-linux-docker no longer auto-mounts/probes a Windows teaspeak-bundle
- Connect: clientupdate client_platform follows host OS (Linux/macOS/Windows)
  instead of always announcing Windows
* gts2 API: beta/nightly download URLs use release-{arch}.tar.gz (same deploy
  archive name as Windows; channel = version-folder suffix b/n)
* Runtime: logs expected NODE_MODULE_VERSION on native load failure

2.10.3:
- Video: camera/screen broadcast keeps running on the server where it was
  started when switching connection tabs — TX is bound to the owner
  connection (not UI focus); toolbar shows sharing only on that tab
* Settings: rename Forum nav to myGreenteaspeak and move it to the top of
  General (Allgemein); remove empty Identity section
* Settings: myGreenteaspeak page title/copy (was Forumverbindung); show
  account email on the connected card when the forum API provides it; use
  the GTS2 app icon for the myGreenteaspeak nav entry

2.10.2:
- Audio: headset / default-device hotplug — soft-rebind capture+playback when
  WASAPI devices disappear or return (no full app restart); capture health
  pokes start() so stream_invalid recovers while send stays enabled
- Talk lamps: peer indicators stay off while BUFFERING|STOPPED; packet hints
  no longer refresh BUFFERING into a Dauerlampe; callback_playback only lights
  when already audible (PLAYING|STOPPING)
+ Audio (Darwin): native Core Audio HAL path; miniaudio refused on macOS

2.10.1:
- Away: status no longer clears when switching connection tabs — each tab keeps
  its own away flag/message; toolbar Away follows the focused tab; All servers
  applies to every open connection
- Video: watching another client's camera/screen while your own camera is on
  works again — Markus-style extra recvonly video m-lines, canvas fallback
  SSRCs on camera/screen slots, local ICE buffered until the remote
  description is set, and soft-ignore of UnknownMediaChannel (1792) ICE races
- Channel video: hide own broadcast from the remote watch list (local preview
  only), matching Markus LocalClientEntry filtering
- Video watch: stop leave+rtcsessionreset loop — trailing empty
  notifybroadcastvideo rows no longer wipe the channel list mid-watch; UI
  debounces vanish; no double leave/reset (fixes ICE Unauthorized / bad
  local username storm after join)
- Poke (Anstupser): multi-poke received window — card rows with avatar
  initials, clearer nick/time/message hierarchy; scrollbar only when needed
- Poke (Anstupser): stay above the main window when the client is already in
  the foreground (owned/modal child + AOT; no flash-main race before show)
- Screen share: system/desktop audio actually reaches peers — after loopback
  capture, send TeaSpeak `broadcastaudio` with the audio SSRC (Markus path);
  prior fix attached the track locally but never started the channel broadcast
- Screen share: capture video via chromeMediaSourceId and loopback via a
  separate getDisplayMedia grant (Windows window+loopback was silent/empty)
+ Icons: flood/antiflood throttle plus quieter connect (fewer icon storms)
+ Talk status: Markus-aligned peer indicators (PLAYING|STOPPING); PTT
  send-enable so local talk lamp matches actual TX
+ Voice: multi-tab exclusive TX — unmute claims one speak tab; UI focus may
  stay on another muted tab (Markus-style work Tab1 / speak Tab2)
+ Audio: playback amplifier setting for louder remote voice
+ Server admin: Alle Clients list; Ban list CRUD; Nachrichten presets
  (away / kick / ban texts)
+ UI: modern kick/ban dialogs with ban preset picker
+ Connection: middle-click connection info; notifyconnectioninfo wait fix
+ Channel tree: moderated-channel icon (client-moderated with M badge)
- Client hang: softer command-path probe (less aggressive whoami recovery)
- News ticker: soft-fail so a bad feed no longer blocks the UI
- CSS: global.css truncation fix (styles no longer cut off mid-rule)

2.10.0:
* Initial 2.10.x line after 2.9.9 carry; release notes continued under 2.10.1

2.9.9:
* Release skipped in semver sequence (patch max 9 carried 2.9.9 → 2.10.0);
  notes shipped under 2.10.0 / 2.10.1

2.9.8:
- Voice: rebuild Opus without OPUS_X86_PRESUME_SSE4_1 (RTCD only) and bypass
  WebRTC AudioProcessing::ProcessStream on capture — fixes remaining
  STATUS_ILLEGAL_INSTRUCTION (0xC000001D) on talk after 2.9.7 AGC-off path
  (repro: Opened WASAPI capture → encode queue → crash in teaclient_connection)

2.9.7:
- Voice: fix main-process crash when starting to talk (STATUS_ILLEGAL_INSTRUCTION
  0xC000001D in teaclient_connection) — stop applying FixedDigital WebRTC capture
  AGC; disable AGC/AEC/NS/VAD on capture so SSE4.1 process paths are not forced
  on CPUs that abort there (repro: PTT/unmute → Opened WASAPI capture → crash)
- Channel tree: multi-select / multi-move hold-key works again with side-specific
  bindings (Alt Links / Strg Links) — captureBinding stored altleft/ctrlleft but
  the matcher only accepted bare alt/ctrl; also ignore Dead-key mis-captures

2.9.6:
+ Plugins: Tools menu lists installed UI plugins; Soundboard plugin sends WAV
  clips into the voice channel (mic TX mix, local monitor, hotkeys)
+ Channel tree: drag-and-drop channel reorder/move with server sync
+ Talk status: multi-user talk lamps stay reliable (voice-packet activity +
  sticky talk-indicator watchdog)
+ File browser: download/rename/delete, drag-and-drop upload, multi-select,
  progress, and dedicated Electron window
- Audio: Opus corrupted-stream / whisper UID handling; clearer outbound mic
  (capture DSP + higher Opus send bitrate)
+ Icons: country flags in the client tree/info panel from local SVG map
+ UI: TeamSpeak-style brand watermark in the info panel and chat log

2.9.5:
+ Crash dialog: optional upload of minidump plus the last two client logs to
  https://greenteaspeak.de/bug-report (multipart form; best-effort, no secrets)
* Natives: Electron 33 ABI 130 rebuild includes VoiceClient force_replay UAF
  fix (ACCESS_VIOLATION on duplicate stop / stream-timeout packets)

2.9.4:
+ Icons: server group menu icons load via MenuIconLoader with SHA1 disk cache
  (faster reopen, fewer duplicate downloads)
+ Audio: WAV recording of mic + remote mix for local capture/review
- Settings: crash-safe prefs — atomic JSON writes (temp+rename) plus .bak
  restore so a mid-write crash no longer resets audio devices / identities /
  bookmarks to defaults; corrupt files are quarantined, never wiped silently
- Talk lamps: packet-primary hang no longer leaves peer lamps stuck on
- Connection: command-path recovery — whoami probe before connection-lost;
  getconnectioninfo / clientmove timeouts handled without false disconnects
- Audio: Opus corrupted-stream / whisper UID fix; native log rate-limit for
  spammy decode errors
- Voice: fix main-process crash (ACCESS_VIOLATION in teaclient_connection) when
  an old/duplicate stop or stream-timeout packet deleted a buffer still held by
  force_replay — clear force_replay before delete
* Natives: Electron 33 ABI 130 (teaclient_*.node) required for GTS2

2.9.3:
- Update: refuse GTS1 / legacy packages on the GTS2 API (GreenTeaSpeak1-Setup,
  GTS1 - Legacy.exe, app-info major≠2) so a wrong deploy cannot overwrite GTS2

2.9.2:
- Talk status: multi-user talk lamps stay reliable via voice-packet activity
  plus a sticky talk-indicator watchdog (peers no longer stick on/off incorrectly)
- Audio: clearer outbound mic (less woolly/muffled) — capture DSP policy
  (FixedDigital AGC; AEC/HPF/AGC2 off) and Opus send bitrate 96 kbps
- Icons: after upload, cache put / forget disk so tree badges refresh without
  a stale HTTP/icon cache hit
* Natives: teaclient_*.node must be built for Electron 33 (ABI 130); wrong ABI
  yields "Module did not self-register" under GTS2

2.9.1:
- Audio: mic not sending after reconnect — detach/rebind capture and force
  send-state sync so transmit resumes after reconnect
+ Settings: custom disconnect/quit message
- Update: pass /allusers|/currentuser to Setup; re-stamp shortcut AppUserModelID
- Settings: do not overwrite saved mic/headphones when native audio falls back
  to default after update; pin userData to `%APPDATA%\GreenTeaSpeak 2` (migrate
  legacy `greenteaclient` folder if present)

2.8.9:
- Away: status and message persist after the idle timeout fires (no longer
  cleared when the away timer expires)
- Away: enabling Away mutes the microphone; unmute is blocked while Away is
  active so the client cannot send audio in Away state
- Info panel: fall back to server info when channel details are unavailable
- Talk lamp: sticky own-client talk indicator watchdog so the lamp cannot
  remain stuck on after send stops

2.8.8:
- Audio: Chromium getUserMedia mic/echo tests disable autoGainControl so they
  cannot rewrite the Windows microphone mixer level
- Audio: device remapping no longer strips "(Brand …)" from labels — fixes
  false WASAPI remaps (e.g. RODECaster Chat→Main, Realtek→RODECaster) that
  caused quiet send and "no remote sound" on the wrong output
- Logging: filter native playback-state / fadeout spam; support logs keep
  device/volume/error lines; connection channel moves stay UI-only

2.8.7:
+ Screen share: optional system audio (Windows/Linux loopback) with the share —
  Discord-like default toggle; camera share never includes it
+ Screen share: switch window/screen mid-session via replaceTrack without full
  hangup (toolbar / Change opens picker; Stop stays on the preview)
+ Screen share: enable/disable share audio while broadcasting; viewers can
  mute/unmute remote share audio independently (autoplay stays muted until unmute)
- Talk lamp: own client indicator in the channel tree follows mic send again
  (continuous / PTT / VAD); uses configured Talk-Lämpchen color
- Talk lamp: switching continuous↔VAD while unmuted no longer leaves the own
  lamp dark or stuck on; device/audio restart no longer clears it after restore
- Talk lamp: server mute/talking echoes no longer overwrite the local own-client
  talk/mute state
- Tray: while talking the notification-area icon is replaced by a TeamSpeak-style
  talk-lamp orb (Talk-Lämpchen color); normal logo when idle, gray when
  muted/deafened; tooltip includes Talking / muted / deafened

2.8.6:
- Permissions: send permvalue as signed int32 (oldclient `value | 0`) so setting
  a server/channel group icon (i_icon_id CRC32 > 2^31-1) no longer kicks with
  "Invalid argument (failed to parse permvalue as i (stoi))"
- Permissions: after creating or renaming a server/channel group, refresh the
  open permission editor group list immediately (no close/reopen)
- Camera/video UX: remote watch tiles stay muted for Chromium autoplay (no more
  black preview); failed Watch leaves the server broadcast again (no orphan join)
- Camera/video UX: channel bar grid shows only streams you watch (chips still
  discover everyone); clearer empty hint instead of idle black tiles
- Camera share: live mirrored picker preview; denied/busy/missing camera errors
  instead of “no camera”; stop orphan tracks on start failure / unmount / disconnect

2.8.5:
* Build for updater verification (no functional changes)

2.8.4:
- Updater: log real Start-Process / spawn errors to the client log file
- i18n: updateInstallerStartFailed / updateInstallerMissing use real newlines
  (no literal \n in the error dialog)

2.8.3:
- Setup finish/update relaunch now uses ExecShellAsUser so an elevated installer
  cannot spawn GreenTeaSpeak 2.exe as administrator (false "UAC at client start")

2.8.1:
- Updater: when Release channel has no packages, fall back to beta so the client
  is not stuck with "no updates" while Release is empty on the API
- Updater: compare build timestamps so same-semver rebuilds still offer an update

2.8.0:
- Antiflood: throttle/serialize server icon downloads (max 2 parallel, start gap,
  backoff on temporary FT failures); do not remount-retry 2051/flood errors
* Signed icon path retry on 2051 still applies, with a short delay between forms
- Voice: stop rewarming the full peer roster on every mute/PTT/send sync (was
  logging "rewarmed N … after audio restart" dozens of times per minute); rewarm
  only after a hard audio backend restart, coalesced
- Flood ban (3331): never auto-reconnect on ban/flood; show banned notice; if a
  reconnect is scheduled for other reasons, wait until ban expiry when parsed
- Updater: resolve PowerShell via SystemRoot (packaged PATH), await spawn success
  before exit, shut down voice/sessions before apply, surface start failures to
  the updater window instead of silently quitting

2.7.9:
- Server/group icons: on FT error 2051 (file not found), retry download with the
  int32 signed path form (`/icon_-N`) when the CRC32 id has the high bit set —
  classic TeamSpeak signed-vs-unsigned mismatch; do not cache 2051 until both forms fail
* Icon download warnings now include host, port, path, and error id
- Icon file list accepts signed `icon_-N` names from ftgetfilelist
* ftinitdownload/upload send empty `path=` like the oldclient (name still holds `/icon_…`)

2.7.7:
* Updater: one-click happy path (download + apply, no second “Apply update” step); simpler progress copy; channel options moved under Advanced
* Desktop main process respects UI language (tray, native dialogs, window titles, VoIP/crash dialogs, disconnect notices)
- Server/channel/client icons load on servers with a non-default file transfer port (same notifystart* port path as channel files; retry instead of caching FT failures)

2.7.6:
+ UI languages: 10 locales (de, en, nl, pt, hu, es, ru, it, tr, pl) — language setting switches the full interface (menus, settings, dialogs, tray, connection logs)
* Language preference stores a stable locale code; OS language is used on first launch
- Voice: stop thinning peer jitter to 60ms (UI default / first volume edit); use 100ms and ignore live volume ticks on the hot path — cuts intermittent underflow fadeouts ("wolliger" / muffled peer audio)
- Voice: Opus FEC decode flag actually passed to opus_decode_float (was hardcoded 0 in the shipped native tree)
+ File transfer: auto-detect FT TCP port from server notifystart* (uses whatever the server configured — e.g. 30033 / 30303 / custom; last-resort fallback 30303 only if omitted)

2.7.5:
- Voice: enable Opus FEC on decode (was hardcoded off — one lost packet became an audible glitch)
- Voice: large packet-ID gaps (late join / rewarm) resync cleanly instead of "missing 12000 packets"
- Protocol: increment command resend_count (was never increased → endless "Resending 1 packets" for hours)
- Protocol: grow command reassembly buffer 32→128 (reduces underflow drops on long sessions)
- Protocol: match command ACKs by packet id & 0xFFFF (generation-safe)
- Uninstall/reinstall: force-kill "GreenTeaSpeak 2.exe" (tray) on init/install/uninstall so a leftover process cannot stay running after remove or during reinstall

2.7.4:
- Updater: wait for client PID exit before copy; relaunch EXE after update
+ Server group dialog: assignment window with checkboxes (not the permission editor)
- Log filenames use local time instead of UTC (fixes 23:25 names at 01:25)

2.7.3:
- Soft 3D: hard-block spatial peer volume at native layer (no distance duck / "wool blanket" / sock-in-mouth path)

2.7.2:
+ Updater: client relaunches automatically after update (Finish page skipped)
- Context menu: show server/channel group icons next to group names

2.7.1:
* Soft 3D / spatial gain fully disabled (kill switch) until muffled-audio investigation is done
- Connect: serialize all connects; replace same-server tab instead of spawning a second session (fixes Sweety/Sweety1 doppel-connect)
- Weblist connect: use selected identity / forum handshake (no anonymous second UID)
- Reconnect: block parallel resume+timer handshakes

2.7.0:
- Fixed: jitter buffer (80ms) was never actually applied due to wrong set order (max must be set before min); this caused constant near-zero buffering and frequent underflow fadeouts ("wool blanket" / muffled sound on peers)
* Update channel: Release channel is now available and selectable in settings

2.6.9:
- Playback no longer resets the jitter buffer on every volume tick (fixes intermittent muffled/"wool blanket" peer audio)
* Soft 3D: clear leftover spatial gains on connect when no plugin owns spatial; UI still does not drive audio

2.6.8:
- Soft 3D no longer ducks other users' volume in normal voice use; spatial gain only applies when a plugin (e.g. SaltyChat) drives it
* Soft 3D dialog: placement preview only; audio stays off until a plugin locks spatial
* Soft 3D persist: do not auto-enable from spatial-3d.json; remap placements by nickname

2.6.7:
+ Plugin runtime: install/enable plugins via Extensions (catalog ZIP or local folder)
+ Soft 3D / spatial voice engine and Extras → 3D Sound dialog (AFK placement)
+ Server Unique ID shown in the info panel and copyable from the context menu
+ Online catalog can download plugins (e.g. SaltyChat) separately from sound packs
* Server license labels: NPG (Non-Profit Gamer), CGL (Community Gamer License), AGHP (Authorized GreenTeaSpeak Host Provider)
- Audio Apply while connected: soft device switch instead of tearing down VoiceClients (no more silent peers until rejoin)
* Plugins are not shipped inside the installer; SDK is for developers only

2.6.6:
* Ship bundled sound packs as real files under resources/soundpacks (extraResources) so updates replace Speech Male/Female stereo WAVs for installed clients

2.6.5:
+ Sound pack catalog preview images are saved locally and shown for installed packs
+ Poke dialog: right-click copy/select-all; links in poke messages are clickable
* Bundled Speech (Male) / Speech (Female) sound packs converted from mono to stereo

2.6.4:
- Favorites: name collisions get (1)/(2) suffixes instead of doubling the label
- UI stays usable on server timeout / reconnect (disconnect, cancel, favorites)

2.6.3:
* Update channel: Beta is the default; Release stays grayed out until UPDATE_RELEASE_CHANNEL_ENABLED is flipped
- Sound pack selection from the online catalog survives restart and updates (hydrate, catalogId, download fixes)
- Mass move: coalesce leave/join/moved sounds (no triple spam; at most one cue after bulk)

2.6.2:
- Suppress whisper error 1804 spam when there are no whisper targets; stop sending on empty targets
+ Faster domain:port connect (skip TSDNS/SRV TCP probes for explicit host:port; DNS/status cache)
* Channel [*spacer…] repetitive spacers match oldclient behavior

2.6.1:
- Incoming whisper audio playback fixed (VOICE_WHISPER receive)
+ Remote whisper talk lamp in channel tree
* Whisper receive notification sound uses short soft shush (pissst) instead of chat ding

2.6.0:
+ Whisper lists with hold hotkeys (PTT-style; VAD ignored while whispering)
+ Whisper settings (Audio → Whisper): incoming rights, sound, history panel
* Whisper receive cue uses short soft shush (whisper_notify), not chat ding
+ Contacts: right-click friend/block, contacts dialog, custom display names
+ Configurable talk-lamp colors for Whisper and Channel Commander
+ Channel description and topic shown in the info panel
+ Undocked channel tree: “fold main window” keeps the tree open (X still quits)
- Fix alien/robot mic pitch on high sample-rate capture devices
- Fix native crash in audio event queue (null weak_ptr on disconnect/exit)
- Whisper no longer spams whisper.list.empty; empty sound removed
- Channel switch no longer plays a barrage of join sounds or false channel-edit sounds
- Duplicate permission error on failed client move removed
* Contacts show as [Custom Name] Nickname (no friend sphere icon)

2.5.9:
+ Light and dark theme support across the client UI
+ Talk lamp: idle state uses a darker color for clearer speaking feedback
+ Events and notifications wiring improved
+ Chat timestamps show the date; chat font size setting applies correctly
+ Screen and camera picker modernized; camera background blur and image options
- File browser no longer shows a duplicate title
- Fix bot:get-settings request handling
- Video UI styling corrected for light mode
* Screen/camera share performance improvements

2.5.8:
+ In-app browser (BrowserView): back/forward/reload; same URL re-opens with hard refresh
- Away-with-message dropdown works again when the info panel is hidden (tree-only layout)
- Channel tree colors: current channel blue, password yellow, full red (was inverted)
- Connect / homepage / weblist: use identity or last nickname instead of the default placeholder
- Push-to-talk: Left and Right Ctrl can be bound separately
- Move sounds no longer play two or three times for one client move
- File transfer finished sounds (upload/download)
- Native voice: auto-register speakers, 80ms jitter default, separate encode/decode threads (multi-speaker quality)
- Sound pack selection from the online catalog persists across updates
* Forum session soft-renew on startup after client updates
* Profiles: identity display name labeled as Nickname for new connections

2.5.6:
+ Server edit dialog: modern GTS2 layout with sidebar categories (General, Host, …)
+ Permission editor: modern GTS2 shell, sidebar navigation, window-filling layout
+ Group members: add clients via clear modal (DB-ID or Unique ID) instead of cramped inline fields
- Server edit: default groups selectable by name; server nicknames display-only in the dialog
* Permission editor primary actions use GTS2 green styling

2.5.4:
- Connect: "Connected" status appears immediately after the channel list loads; roster subscribe runs in the background
- Sound packs: connect chime plays right away (no wait for imported-pack scan); only connection.connected on join (no spurious channel.edited during bootstrap)
- Permission editor: fixed blank window, flickering, and duplicate loading; cache-first group list and stable tab switching

2.5.3:
- Updater: apply update exits immediately so the installer or in-place copy can replace locked files (fixes update not starting after apply)

2.5.2:
- Audio: remap legacy native device ids (ma-out:/ma-in:) by device name; fall back to default instead of invalid device id on apply
- Microphone settings: native level meter for mic test when using miniaudio (live level bar works again)

2.5.1:
- Sound packs: play via stable HTML audio on the configured output device (Chromium setSinkId with native device name mapping)
- Sound packs: no longer use native playback_sound path (fixes cut-off, stutter, and crash on long sounds)

2.5.0:
+ Channel file browser: context menu for download, rename (F2), and delete
+ Hotkeys: multi-client selection / multi-move hold key is configurable (any key or modifier; default Alt)
- Permission editor: integer/grant fields are editable again; active tab scopes rights (no mixing across tabs)
* Extensions browser UI cleaned up (toolbar, list rows); Themes/Plugins remain disabled for now

2.4.9:
+ Settings → Extensions: browse and download sound packs from greenteaspeak.de (online catalog with install progress)
+ Only Speech sound packs ship with the installer; Kleiner Nils, Military (English), and GTS2 are available via the online catalog
* Themes and Plugins categories are shown but disabled until supported

2.4.8:
+ Bundled sound packs: Speech (Male), Speech (Female), Kleiner Nils (by Struppi), and Military (English)
+ sound packs: GTS event mapping generated from settings.ini (join/move/chat sounds work correctly)
- Sound pack event sounds are suppressed while deaf (speaker off)
- Fix startup crash when loading imported  sound packs (mapping module bundled in main process)

2.4.7:
+ Multi-client move: Ctrl+drag over clients to add to selection; own client can be included and moves with the group
+ Bulk move plays the move sound once instead of once per client
- Channels are no longer included in Ctrl+click or Ctrl+drag multi-selection
- Bundle MSVC runtime DLLs (vcruntime140, msvcp140) so native modules load on PCs without Visual C++ Redist
- Fix connection log language helper import on startup

2.4.6:
+ VoIP blacklist check via license server (SRV/DNS resolve to IPv4, API true/marked/false)
+ Blacklisted servers: warning dialog, red session log entry, connection rejected
+ Marked (suspicious) servers: warning dialog with Continue/Cancel; red log entry
- Blacklist warning shows again on each new connect attempt; no IPC error stack trace on reject
- Server chat tab (server-root) can no longer be closed

2.4.5:
+ File browser: rename files and folders (F2), drag-and-drop upload
+ Move multiple clients at once (Ctrl+click selection, context menu, drag-and-drop)
+ Close any chat tab including channel chats; close all chats from context menu
+ Application language auto-detected from OS on first start; connection log messages in German or English
+ Sound pack changes apply immediately without restarting the client
- Fix duplicate connection log line when a client is moved (single notifyclientmoved entry only)
- Fix avatars not loading or uploading (missing avatarBufferToDataUrl helper)
- Fix default avatar silhouette visible behind a custom avatar image
- Fix parallel connect attempts causing identity-already-online (521) errors on reconnect

2.4.4:
+ Invite friends from Extras menu or server/channel context menu (gts2server link, HTTP redirect, HTML snippet)
+ Portable edition can launch the bundled installer to install GreenTeaSpeak 2 permanently
- Fix portable client using the same user data folder as the installed app (single-instance lock / silent exit)
- Fix client failing to start after portable-install changes (missing AppInfo import)

2.4.3:
+ Status bar news ticker from greenteaspeak.de (scrolling text with pause between cycles; auto-refresh every 30 seconds)
+ Status bar display options (nickname, identity, ping, server address, connection quality) persist across restarts
- Fix selected microphone and output device not restored after restart — preferences saved to disk and merged on startup
- Fix client volume above 100% (+dB) not making other users audibly louder

2.4.2:
- Fix host banner displayed too small above the channel tree (removed 96px height cap; oldclient banner modes restored)
- Fix own talking indicator staying lit permanently with voice activation (VAD) when not speaking

2.4.1:
- Fix talking indicator stuck on after voice activation (VAD) — server talking flag no longer overrides native playback state
- Fix push-to-talk talking indicator flickering off while the key is still held
- Fix no voice after switching headphones/output device — native device matched by saved name, voice clients re-registered after audio restart, output device applies immediately from settings

2.3.9:
- Fix sound pack and UI sounds playing on the wrong output device (e.g. TV instead of headphones) — route HTML5 audio via setSinkId using device name matching and persisted browser sink ID
- Fix mojibake in connection log / chat system messages (German umlauts and quotes displayed as garbled text)
- Fix forum identity fallback on foreign TeaSpeak servers: when the server rejects the forum handshake, automatically reconnect with the GreenTeaSpeak identity instead of failing with a misleading login error
- Fix forum badges not appearing after switching from forum to normal identity (badges re-synced on connect and tab switch)
- Fix talking indicator (blue glow) showing for clients in other channels — only peers in your own voice channel are highlighted now
+ Channel tree popout window (oldclient-style) with hover button in the channel tree
+ View preferences persist (toolbar, server tabs, status bar, master volume, host banner, info panel)
+ Info panel (right) can be hidden for compact layout; tree stays visible
+ Compact window mode (480px fixed width) when info panel is hidden

2.3.8:
- Fix remaining startup paths that still opened native audio (bootstrap native status, sound-pack output routing)
- Audio settings use browser device list only (no miniaudio in settings); native voice opens on server connect; device names matched by label

2.3.7:
+ Native crash dump reporter (Tea[*]Speak-style): minidump + crash window with dump path on main/renderer crash
+ Dev: `npm run crash-test` triggers a test crash and opens the reporter window

2.3.6:
- Sound pack + UI sounds route to the configured output device (setSinkId), not always system default speakers
- Deafen also mutes the microphone (TeamSpeak-style); undeafen restores mic unless it was muted before

2.3.5:
- Import Tea[*]Speak 3 soundpacks (folder / .zip / .ts3_soundpack with settings.ini) or native GTS2 packs in Settings → Sounds
- Sound Pack as nested submenu under Selbst (Tea[*]Speak-style), with checkmark on active pack
- Drop-in soundpack folders: create/open folder under userData/soundpacks, drop WAVs or settings.ini — auto-detected on refresh
- Favorites: allow multiple bookmarks for the same server address with different names
- Fix Connect dialog: Verbinden waited until after window.close() and never started the connection
- Toolbar: Away → Mute → Deaf → separator → Subscribe → Screen → Camera; Connect / Server list / Disconnect only under Verbinden menu
- Fix Serverliste menu icon (was same as Verbinden; now client-weblist)
- Fix Beenden / Strg+Q / window X: fully quit (no hide-to-tray on close)
- Fix identity import security level (wrong TomCrypt public-key flag showed 0; export now keeps hash-cash offset)
- Fix profile avatar: show uploaded image immediately (preview returned from upload)
- Fix microphone activation threshold at startup: apply saved settings before bootstrap and sync VAD on connect
- Fix Push-to-Talk: no longer auto-mutes when enabling PTT or on startup (idle PTT ≠ muted)

2.3.4:
- Fix global Push-to-Talk in background via WH_KEYBOARD_LL in main (works unfocused/tray; no RIDEV_NOLEGACY freeze)
- Fix PTT when binding is Ctrl/Alt/Shift (map L/R modifier VKs; no GetAsyncKeyState inside hook)
- GetAsyncKeyState 10ms poll backup (Discord-style) if LL hook is starved
- System tray like Tea[*]Speak: X hides to tray; double-click / menu to show; mute, disconnect, quit from tray

2.3.3:
- Fix global Push-to-Talk in background: run teaclient_ppt in an Electron utilityProcess (renderer was throttled when unfocused; main RIDEV_NOLEGACY freezes UI)

2.3.2:
- Local client/bot volume: oldclient-style dB dialog for users; re-apply native VoiceClient volume when clients talk
- Global Push-to-Talk outside the window via teaclient_ppt in preload (not Electron main)
- License badge: only servers with version like `2.5.1 [Build: …]` are GreenTeaSpeak; `TeaSpeak 1.4.x…` shows "Kein GreenTeaSpeak-Server"
- Tidy client context menu: nest Info / Move / Moderation / Audio; shorter labels

2.3.1:
- Wire Sprachlautstärke (and Aufnahmelautstärke) to native playback/capture volume — slider previously only wrote localStorage

2.3.0:
- Push-to-Talk / voice idle no longer sets client mute: not transmitting looks dark (no talk), not muted; real mute stays a separate mic toggle

2.2.9:
- Fix local mute/volume/latency for users and music bots under native voice (settings were only applied to the unused WebAudio path)

2.2.8:
- Fix Push-to-Talk sticking open after release: native send enable/disable race + key-up ignored when modifiers differed; release remutes reliably (hold = talk, release = mute)

2.2.7:
- Fix Push-to-Talk actually transmitting: Space binding was saved as a literal space character and never matched; PTT now works while chat is focused; main-window key path + setPttHeld no longer no-ops

2.2.6:
- Fix complete UI freeze on startup: do not attach teaclient_ppt in the Electron main process (RIDEV_NOLEGACY Raw Input blocked keyboard/mouse for Chromium). Push-to-Talk still works in the focused window (Space by default)

2.2.5:
- Fix Push-to-Talk: wire native teaclient_ppt for global key capture (works while another window has focus), default key Space, stop persisting momentary unmute into audio prefs, sync mic send after connect
- Fix chat parity with oldclient: private chats keyed by unique id (survive reconnect), server chat (targetmode 3) sendable again, send/receive sounds and timestamps aligned
- Selecting a client who leaves the server now switches back to server info instead of polling getconnectioninfo (stops "Fehler (512): invalid clientID" spam)
* License label for hoster tier: "Authorized GreenTeaSpeak Host Provider"

2.2.4:
- Fix "too many clones connected (hwid)" on foreign TeaSpeak servers: every install now has its own hardware id instead of the shared static "gts2-native" (that made every GTS2 user look like the same machine)
- Untagged clientinit rejections are no longer silently swallowed — connect fails immediately with the real server message instead of hanging for 30s
+ Auto-improve identity security level when a server demands a higher level (0x207) and reconnect once

2.2.3:
- Fix joining foreign TeaSpeak servers that silently ignore the forum identity proof (no error, just a 20s timeout): any forum handshake failure now triggers the automatic retry with the GreenTeaSpeak identity
* Forum handshake timeouts reduced from 20s to 8s so the identity fallback kicks in quickly

2.2.2:
+ Client log files for diagnostics: every session writes a log to %APPDATA%/GreenTeaSpeak 2/logs (connection log, protocol/handshake output, errors, system info)
+ Menu entry Extras -> "Client Protokoll" (Ctrl+L) now opens the log folder
* Log housekeeping: keeps the last 10 files, 20 MB cap per file

2.2.1:
- Fix joining foreign TeaSpeak servers while logged into the forum: when a server rejects the forum identity, the client now automatically reconnects once with the GreenTeaSpeak identity (oldclient users had to switch profiles manually)
- Honest error message when a server cannot verify the forum identity (previously a misleading "please re-login to the forum")
- Fix "failed to resolve hostname" on domains that only have an SRV record: SRV lookup timeout raised from 600ms to 3s for slow DNS resolvers
* All visible product wording now says GreenTeaSpeak (identity labels, profile manager, error messages)

2.2.0:
! Third-party server support removed — TeaSpeak/GreenTeaSpeak is the only supported target
- Fix connect failures with normal (non-forum) identities: the TeaSpeak identity handshake now always runs (no legacy clientinit fallback)
+ Native file transfer implemented (raw TCP, oldclient wire protocol) — downloads and uploads work on native connections
+ Server group / channel group icons load again (ftinitdownload now sends seekpos=0 and proto=1 like the oldclient — fixes the "seekpos" parser kick)
+ File transfers use the SRV/DNS-resolved server host (fixes ENOTFOUND on domains without an A record)
+ Host banner sits above the channel tree like the oldclient: full width, aspect-ratio scaling, click opens the hostbanner URL, periodic gfx refresh, no placeholder without a banner
+ Connect dialog is a standalone window: compact by default, "More" reveals advanced settings, window height auto-fits the form
+ MusicBot "Add song" dialog (Enter song URL) replaces the browser prompt
+ MusicBot "Manage bot" opens the Playlist Manage window: name, channel commander, priority speaker, replay mode, max playlist size, delete played songs, song-change notification
+ Playlist Manage permissions tab: view/edit playlist permissions, client-specific permissions via uid/dbid search, list clients with own permissions
+ Saved microphone/audio settings are applied at client start (not only after opening the settings window)
* Icon download failures are logged in the main process console ([icons] ...)

2.1.8:
- Stop repeated "Fehler (256): command not found" spam on servers that do not support optional TeaSpeak commands
* Auto-disable unsupported optional commands per session (`setconnectioninfo`, `requeststreaminfo`) after first "command not found"
- Fix connect-time server kick "Invalid argument (failed to parse seekpos as m (stoull))" on affected TeaSpeak forks by skipping native remote icon file-transfer probes

2.1.7:
+ Settings list native miniaudio devices (voice:get-devices) instead of browser device ids — selections now reach the native voice backend
+ Device selection works before the first connect (standalone native controller) and saved devices are applied when native voice initializes
- Live input device switch: stop → set_device → start recorder cycle (oldclient pattern) — voice send no longer dies after changing the microphone
- "default" / stale device ids resolve to the real OS default device instead of failing silently
* Mic test maps the selected native device to the matching browser device by label

2.1.6:
+ Inline nickname rename in channel tree: click your own selected entry to edit (classic client style)
+ Server log entry when a client changes their nickname ("X changed his nickname from ...")
+ Local permission DB: catalog served from memory/disk snapshot, background refresh (oldclient-fast editor open)
+ Screen/camera share buttons are disabled with tooltip when b_video_screen / b_video_camera is missing
- Fix access violation (0xC0000005) on quit/disconnect: detach native callbacks, grace period before destroying the server connection
+ Main-process package @greentea/native-bridge (loader, NativeProtocolClient, NativeVoiceController)
+ Hardcoded PermissionType enum + group_mapping (1:1 oldclient) in @greentea/ipc-contracts
* Default transport/voice: honeybbq + WebAudio (native spawn_server_connection crashes on Electron 33; opt-in GTS_TRANSPORT=native)
* Native command stream: one notify row per event (fixes multi-user talking/mute/tree status)
* Native voice: register clients on enter, talking from playback state, skip renderer WebAudio
* Runtime diagnostics report real native load status; electron-builder packs native/build → resources/natives
* npm scripts: build-natives, rebuild-natives:clean, verify:native-abi
* Talking indicators in channel tree for all visible clients (oldclient), not only own channel
- Channel tree: subscribe + clientlist before UI "connected" (oldclient cold tree — no fake join trickle)
- Native clientlist: accumulate response rows for execCommandWithResponse
- Screen/camera share: use 1.6 Mbps default (oldclient); 4 Mbps exceeded i_video_max_kbps (2500) → permission 2568 for non-admins
- Updater: Accept-Encoding identity, gzip magic check, clearer errors for zlib "invalid block type"

2.1.5:
* HoneyBBQ: wrap diagnostics and always-ACK path kept (survives packet-id generation wrap with fixed server ACK match)
- Forum renew: use web-api/v1/renew&auth_key (works with fixed forum API)
* Online seit: live duration from client_lastconnected for users

2.1.4:
+ Modern favorites manager: search, grouped fields, connect in footer, Settings-aligned look
+ Modern identity/profiles window: side-by-side layout, status pills, German UI
+ Persist local client volume/mute/latency by unique ID (oldclient parity, per server)
* Keepalive: setconnectioninfo every 5s, whoami every 15s; quieter protocol logs (less audio hitch)
- VoiceSession: only re-apply output device / volume / latency when values change (avoid audio clicks)
- Updater: longer download timeout for large tar.gz (avoid truncated gzip / invalid stored block lengths)
- Fix client connection info all-zeros (concurrent getconnectioninfo notify collector race)
- Fix ~4h–7h disconnect "Packet resend failed": ACK every command by cleartext header id, even when decrypt fails at packet-id wrap
* HoneyBBQ: decrypt failures now logged (id/type/generation) instead of silently dropping the packet
* HoneyBBQ: wrap diagnostics — duplicate command re-delivery and send/recv generation changes logged with timestamps
* HoneyBBQ: receive window half-range (32768), circular isInWindow/isOldPacket, decrypt gen fallback ±4
- Forum identity: auto-renew via auth-key before connect (no hard 48h block while session is valid)
- Forum renew: correct API route (web-api/v1/renew with auth_key) — previous route returned 404, renew never worked

2.1.3:
+ Updater window like oldclient: installed vs latest version, download progress bar and log
+ Kick/Ban reason dialogs (Electron has no window.prompt — Cancel no longer kicks)
+ Modern settings shell: searchable sidebar, page headers, grouped cards, toggle switches
* Slow channel-tree clientlist poll from 10s to 20s to reduce command pressure
- Fix main-process crash ERR_SOCKET_BAD_PORT on UDP send after disconnect (HoneyBBQ safe send + ignore benign socket errors)
- Fix connect timeout: wait for identity-proof ACK before clientinit (TeaSpeak rejects early clientinit with not logged in)
- Clearer handshake errors (forum outdated / proof failed) instead of remapping every timeout to forum login
- Fix TeaSpeak handshake: use return_code so server emits proof ACK before clientinit

2.1.2:
+ Music bot: play channel files via ChannelProvider (Add file → file browser picker)
+ File browser: multi-select upload (upload several files in one go)
+ File browser: create folder via inline name field (Electron has no window.prompt)
+ File browser: upload/download progress bar (bytes + percent, multi-file index)
+ File browser opens in its own Electron window (like icon viewer / server list)
+ File browser: multi-select (Ctrl/Shift+click, Ctrl+A) for batch delete / bot playlist add
- Fix finished playlist songs sticking in the UI (handle notifyplaylistsongremove / replace on force reload)
- Fix connection drop "Packet resend failed" after long sessions (ACK wrap-around in GenerationWindow)
* HoneyBBQ patch: treat half-range packet IDs as old duplicates (oldclient parity)

2.1.1:
+ Responsive info panels (container queries) — detail views adapt when the window is not maximized
+ Modern microphone capture settings with TS3-style level meter (−50…+50, live fill, draggable threshold)
* Server tabs: hide tab strip with a single connection; show tabs from the second connection (oldclient)
* Mute system like oldclient: persist mute/deafen, copy state to new tabs, no force-mute on tab switch
- No microphone activated/muted WAV on connect or tab switch — only on explicit user toggle
- Fix music bot playlist not loading (always fetch clientinfo for client_playlist_id in full getBotInfo)
- Fix stale bot "now playing" title for radio streams (sync player_title / refresh live clientinfo)
- Fix command-queue lag from getconnectioninfo pollers (coalesce + cache, gentler UI intervals)
- Fix info panel flashing "Keine Auswahl" while bot/user/channel details are still loading

2.1.0:
+ Redesigned About dialog with Über / Copyright / Lizenz tabs (GreenTeaSpeak Systems branding)
+ Public server list window (Weblist API) with filters, sort, and connect — like the classic client
* Server list runs in its own Electron window; Weblist API is fetched only when that window opens
+ Show disconnect notice dialog when the server forces a leave
- Fix mute / talking / status icons missing after reconnect (e.g. server shutdown)
- Fix music bot talking indicator missing while playing (server talking=0 overwrote voice; sticky player_state)
- Fix music bot subscribe spam after reconnect ("Not running"); defer/retry quietly until protocol is ready
- Answer TeaSpeak notifyconnectioninforequest with setconnectioninfo (same recovery path as oldclient)
- Handle server disconnect immediately on notifyclientleftview (kick/ban/shutdown/timeout), like oldclient
- Fix kick: disconnect tab + show kick reason in log/dialog (was sound-only while staying connected)
- Fix badge configure dialog: equipped badges no longer vanish right after drop (click-after-drop + sync race)
- Fix connection timeout while muted / listening to music bots (extra whoami keepalive every 15s)
* Raise protocol packet idle timeout from 60s to 5 minutes when no UDP is received

2.0.9:
+ Forum badge configure UI (equip slots, redeem codes, team badge always on)
+ Badge changes sync to connected servers via client_badges and refresh the UI live
* Keepalive ping every 1s; resume from sleep probes whoami and reconnects if needed
* Channel edit sends only changed fields (avoids full channeledit permission failures)
- Fix badge dialog hang and connection stalls from awaited clientupdate on badge sync
- Fix connection-info polling spam after disconnect (invalid clientID / UDP not running)
- Stop falling back from SVG badges to leftover old PNG artwork

2.0.8:
+ Kick/ban shows who forced you offline and disconnects that tab (no auto-reconnect)
+ Channel kick notice when moved out of a channel
+ Hide ServerQuery clients (serveradmin) by default; show only with view power when enabled
* Channel tree load waits for channellistfinished and batches updates like the classic client
* Apply notifychannelmoved (parent/order) immediately instead of waiting for a poll
- Fix blank "Edit Virtual Server" window (undefined busy variable crash)

2.0.7:
+ Permission editor layout and categories 1:1 from oldclient (group_mapping)
+ Group icons in the permission editor sidebar
+ Icon picker (Edit / Remove / Add) opens Icon Viewer for groups, channels, and server edit
- Fix concurrent icons:list race ("Icon-Liste abgebrochen")

2.0.6:
+ Deep links (gts2server:// / teaclient://) auto-connect; new tab if already connected
* Forum login always sends forum handshake (status/badges) even with a normal identity selected
* Forum badges announced in clientinit so other clients can see them
- Remove unused "GreenTeaSpeak-ID senden" checkbox from Connect dialog

2.0.5:
+ Open gts2server:// (and teaclient://) deep links — fills Connect dialog with host/port
+ Protocol handler registers on packaged installs (Setup) and launches existing instance
* Invite link copy uses gts2server:// instead of ts3server://

2.0.4:
- Protocol client_version now follows package/app-info (no more hardcoded 2.0.0 Alpha)
- Channel edit loads type/limits/advanced flags from channellist cache like the classic client
- Channel needed file powers use correct i_ft_needed_* permission names
- Treat sql no modifications (1283) as success on channel save
- Server chat tab is log-only (not writable)
- Double-click another client opens client-to-client chat
+ Chat context menu (copy, select all, emoticons, line markers, clear)
+ Emoji picker (emoji-mart) on the chat input
+ Changelog dialog under Help ("Changelog lesen")
+ Modern client / channel / server detail panels
* Host banner keeps aspect ratio and crops at the bottom like Tea(*)Speak
* Music bot playlist UI with context menu (play, copy URL, delete)
* Chat background gray; timestamps on all chat lines including system messages
* Channel-edit sound always plays after a successful local channel save

2.0.3:
- Server nicknames: resolve via public directory cache (encrypted local store, ETag refresh)
- Connect shows nickname in UI/log; real host used only internally (DNS prefetched to IP)
- Faster connect path (earlier "connected", post-handshake work in background)
- Voice capture IPC fix (no more invalid transfer / duplicate AudioWorklet errors)
- Play connection.connected on join instead of channel.edited during bootstrap
- DevTools via F12 / Ctrl+Shift+I

2.0.2:
- Away status like the classic client (toolbar toggle, dropdown, away message, tree icon)
- Connect to another server in a new tab (multi-connection tabs)
- Bookmark context menu: Connect, Connect in new tab, Edit favorite
- Cleaner disconnected layout (same proportions as connected, no leftover chat tabs)

2.0.1:
- Hide Query/Template groups unless b_serverinstance_modify_querygroup / modify_templates
- Show server/channel group names in the tree when i_group_show_name_in_tree is Front or Behind
- Editable nickname per bookmark in Favorites manager
- Server "Online since" uses real uptime instead of a placeholder

2.0.0:
+ Secure preload IPC with context isolation and sandbox
+ GreenTeaSpeak-style UI with channel tree, context info, event log and channel chat
+ Client updater via clientapi.greenteaspeak.de/gts2/api.php (setup-installer package)
+ Automatic reconnect after timeout or server drop
+ Classic connection log (host/welcome messages) and poke send/receive dialogs
+ Bookmark management, DNS SRV resolution and persistent server banner support
+ Forum identity with RSA verification, voice, whisper and media foundations
+ Server edit window, icon viewer, and improved client/server details
